package com.future.bantang.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by zzh on 2016/1/11.
 */
public abstract class AbsBaseAdapter<T> extends BaseAdapter{
    public static final String TAG="AbsBaseAdapter";
    private Context context;
    private int resid;//无法确定item布局文件，所以通过外界传进来

    public AbsBaseAdapter(Context context,int resid) {
        super(context);
        this.context=context;
        this.resid=resid;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder viewHolder;
        if(convertView != null){
            viewHolder = (ViewHolder) convertView.getTag();
        } else {
            convertView = LayoutInflater.from(context).inflate(resid, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }

        //从viewholder中获取控件赋值
        bindDatas(viewHolder, (T) mList.get(position));

        disposalView(position,convertView);

        return convertView;
    }

    /**
     * 提供一个抽象方法，用于子适配器来进行数据绑定
     *
     * @param viewHolder
     * @param data
     */
    public abstract void bindDatas(ViewHolder viewHolder, T data);

    /**
     * 提供一个方法,外界可以重写用于对view控制处理
     * @param position
     */
    public void disposalView(int position ,View convertView){

    }


    /**
     * ViewHolder的作用，缓存item布局中的控件对象，以免下一次再fingViewById
     */
    public class ViewHolder {
        //使用一个Map集合，用来存放需要使用到的控件对象，key值即为控件ID
        private Map<Integer, View> mapCache = new HashMap<>();
        //item的布局对象
        private View layoutView;

        public ViewHolder(View layoutView) {
            this.layoutView = layoutView;
        }

        //提供一个获得布局中子控件的方法，参数为控件id
        public View getView(int id) {
            if (mapCache.containsKey(id)) {//查看该控件是否存在于map集合中
                return mapCache.get(id);//如果存在直接从map中获得该控件，并返回
            } else {
                View view = layoutView.findViewById(id);//如果不存在，那么需要从布局对象中，findViewById
                mapCache.put(id, view);//缓存进map集合中
                return view;
            }
        }
    }
}
